package org.jeecg.modules.online.desform.test;
import org.hibernate.dialect.Oracle12cDialect;
import org.hibernate.dialect.function.NoArgSQLFunction;
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.dialect.function.VarArgsSQLFunction;
import org.hibernate.type.StandardBasicTypes;
import org.jeecg.TristoneSystemApplication;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
 * @description:
 * @author: dw
 * @time: 2021/7/15 11:49
 */
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,classes = TristoneSystemApplication.class)
public class MyOracleDialect extends Oracle12cDialect  {
        /**
         * 添加(Oracle)内置函数和自定义函数, 在此类中添加
         */

        protected void registerFunctions() {
            super.registerFunctions();
            //wm_concat()函数是oracle中独有的,mysql中有一个group_concat()函数。
            registerFunction("wm_concat", new StandardSQLFunction("wm_concat", StandardBasicTypes.STRING));

            registerFunction("to_char", new StandardSQLFunction("to_char", StandardBasicTypes.STRING) );

            registerFunction("to_date", new StandardSQLFunction("to_date", StandardBasicTypes.TIMESTAMP) );

            registerFunction("current_date", new NoArgSQLFunction("current_date", StandardBasicTypes.DATE, false) );

            registerFunction("current_time", new NoArgSQLFunction("current_timestamp", StandardBasicTypes.TIME, false) );

            registerFunction("abs", new StandardSQLFunction("abs") );

            registerFunction("sign", new StandardSQLFunction("sign", StandardBasicTypes.INTEGER) );

            registerFunction("acos", new StandardSQLFunction("acos", StandardBasicTypes.DOUBLE) );

            registerFunction("asin", new StandardSQLFunction("asin", StandardBasicTypes.DOUBLE) );

            registerFunction("atan", new StandardSQLFunction("atan", StandardBasicTypes.DOUBLE) );

            registerFunction("bitand", new StandardSQLFunction("bitand") );

            registerFunction("cos", new StandardSQLFunction("cos", StandardBasicTypes.DOUBLE) );

            registerFunction("cosh", new StandardSQLFunction("cosh", StandardBasicTypes.DOUBLE) );

            registerFunction("exp", new StandardSQLFunction("exp", StandardBasicTypes.DOUBLE) );

            registerFunction("ln", new StandardSQLFunction("ln", StandardBasicTypes.DOUBLE) );

            registerFunction("sin", new StandardSQLFunction("sin", StandardBasicTypes.DOUBLE) );

            registerFunction("sinh", new StandardSQLFunction("sinh", StandardBasicTypes.DOUBLE) );

            registerFunction("stddev", new StandardSQLFunction("stddev", StandardBasicTypes.DOUBLE) );

            registerFunction("sqrt", new StandardSQLFunction("sqrt", StandardBasicTypes.DOUBLE) );

            registerFunction("tan", new StandardSQLFunction("tan", StandardBasicTypes.DOUBLE) );

            registerFunction("tanh", new StandardSQLFunction("tanh", StandardBasicTypes.DOUBLE) );

            registerFunction("variance", new StandardSQLFunction("variance", StandardBasicTypes.DOUBLE) );

            registerFunction("round", new StandardSQLFunction("round") );

            registerFunction("trunc", new StandardSQLFunction("trunc") );

            registerFunction("ceil", new StandardSQLFunction("ceil") );

            registerFunction("floor", new StandardSQLFunction("floor") );

            registerFunction("chr", new StandardSQLFunction("chr", StandardBasicTypes.CHARACTER) );

            registerFunction("initcap", new StandardSQLFunction("initcap") );

            registerFunction("lower", new StandardSQLFunction("lower") );

            registerFunction("ltrim", new StandardSQLFunction("ltrim") );

            registerFunction("rtrim", new StandardSQLFunction("rtrim") );

            registerFunction("soundex", new StandardSQLFunction("soundex") );

            registerFunction("upper", new StandardSQLFunction("upper") );

            registerFunction("ascii", new StandardSQLFunction("ascii", StandardBasicTypes.INTEGER) );

            registerFunction("current_timestamp", new NoArgSQLFunction("current_timestamp", StandardBasicTypes.TIMESTAMP, false) );

            registerFunction("last_day", new StandardSQLFunction("last_day", StandardBasicTypes.DATE) );

            registerFunction("sysdate", new NoArgSQLFunction("sysdate", StandardBasicTypes.DATE, false) );

            registerFunction("systimestamp", new NoArgSQLFunction("systimestamp", StandardBasicTypes.TIMESTAMP, false) );

            registerFunction("uid", new NoArgSQLFunction("uid", StandardBasicTypes.INTEGER, false) );

            registerFunction("user", new NoArgSQLFunction("user", StandardBasicTypes.STRING, false) );

            registerFunction("rowid", new NoArgSQLFunction("rowid", StandardBasicTypes.LONG, false) );

            registerFunction("rownum", new NoArgSQLFunction("rownum", StandardBasicTypes.LONG, false) );//Multi-param string dialect functions...

            registerFunction( "concat", new VarArgsSQLFunction(StandardBasicTypes.STRING, "", "||", "") );

            registerFunction("instr", new StandardSQLFunction("instr", StandardBasicTypes.INTEGER) );

            registerFunction("instrb", new StandardSQLFunction("instrb", StandardBasicTypes.INTEGER) );

            registerFunction("lpad", new StandardSQLFunction("lpad", StandardBasicTypes.STRING) );

            registerFunction("replace", new StandardSQLFunction("replace", StandardBasicTypes.STRING) );

            registerFunction("rpad", new StandardSQLFunction("rpad", StandardBasicTypes.STRING) );

            registerFunction("substr", new StandardSQLFunction("substr", StandardBasicTypes.STRING) );

            registerFunction("substrb", new StandardSQLFunction("substrb", StandardBasicTypes.STRING) );

            registerFunction("translate", new StandardSQLFunction("translate", StandardBasicTypes.STRING) );

            registerFunction("substring", new StandardSQLFunction( "substr", StandardBasicTypes.STRING ) );

            registerFunction("locate", new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "instr(?2,?1)") );

            registerFunction("bit_length", new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "vsize(?1)*8") );

            registerFunction( "atan2", new StandardSQLFunction("atan2", StandardBasicTypes.FLOAT) );

            registerFunction("log", new StandardSQLFunction("log", StandardBasicTypes.INTEGER) );

            registerFunction("mod", new StandardSQLFunction("mod", StandardBasicTypes.INTEGER) );

            registerFunction("nvl", new StandardSQLFunction("nvl") );

            registerFunction("nvl2", new StandardSQLFunction("nvl2") );

            registerFunction("power", new StandardSQLFunction("power", StandardBasicTypes.FLOAT) );//Multi-param date dialect functions...

            registerFunction( "add_months", new StandardSQLFunction("add_months", StandardBasicTypes.DATE) );

            registerFunction("months_between", new StandardSQLFunction("months_between", StandardBasicTypes.FLOAT) );

            registerFunction("next_day", new StandardSQLFunction("next_day", StandardBasicTypes.DATE) );

            registerFunction("str", new StandardSQLFunction("to_char", StandardBasicTypes.STRING) );

        }

        /**
         * 解决启动时数字溢出的错误
         */

        public String getQuerySequencesString() {
            return "select * from user_sequences";
        }
}
